package com.kpmg.datalake.autopackage.templatemanager;

import java.util.concurrent.Callable;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import org.apache.poi.ss.usermodel.Workbook;
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import com.kpmg.datalake.autopackage.utils.ExcelOperateUtil;

/**
 * @ClassName: TemplateManager
 * @Description: 全量模板的全局缓存
 * @author: changpengye
 * @Company KPMG
 * @date: 2018年7月13日 上午8:59:37
 * @version V1.0
 * @modifier
 * @reason
 */

public class TemplateManager {

  private TemplateManager() {}

  private static TemplateManager tM = new TemplateManager();

  public static TemplateManager getInstance() {
    return tM;
  }

  Cache<String, Workbook> workBookCache = CacheBuilder.newBuilder().maximumSize(1000).build();
  private static ThreadPoolExecutor executor =
      new ThreadPoolExecutor(5, 10, 20, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(5));


  /**
   * @Title: addTemplate
   * @Description: 向缓存中新增模板,如果存在会被覆盖,异步步方法
   * @param id
   * @param path
   * @author changpengye
   * @version V1.0
   * @date 2018年7月13日 上午11:42:04
   * @modifier
   * @reason
   */
  public void addTemplate(String id, String path) {
    AddTemplate t = new AddTemplate(id, path);
    executor.execute(t);
  }

  /**
   * @Title: addTemplate
   * @Description: 向缓存中新增模板,如果存在会被覆盖,同步方法
   * @param id
   * @param template
   * @author changpengye
   * @version V1.0
   * @date 2018年7月13日 上午9:00:18
   * @modifier
   * @reason
   */
  public void addTemplate(String id, Workbook template) {

    workBookCache.put(id, template);
  }

  /**
   * @Title: getTemplate
   * @Description: 通过ID获取模板对象
   * @param id
   * @return
   * @author changpengye
   * @version V1.0
   * @date 2018年7月13日 上午9:00:55
   * @modifier
   * @reason
   */
  public Workbook getTemplate(String id) {
    try {
      return workBookCache.get(id, new Callable<Workbook>() {
        @Override
        public Workbook call() throws Exception {
          return null;
        }
      });
    } catch (Exception e) {

      return null;
    }
  }

  /**
   * @Title: deleteTemplate
   * @Description: 根据ID删除模板对象
   * @param id
   * @author changpengye
   * @version V1.0
   * @date 2018年7月13日 上午9:01:12
   * @modifier
   * @reason
   */
  public void deleteTemplate(String id) {
    workBookCache.invalidate(id);
  }
}


/**
 * @ClassName: AddTemplate
 * @Description: 实现向缓存中添加Workbook对象
 * @author: changpengye
 * @Company KPMG
 * @date: 2018年7月13日 上午11:43:04
 * @version V1.0
 * @modifier
 * @reason
 */

class AddTemplate implements Runnable {

  private String path;
  private String id;

  public AddTemplate(String id, String path) {
    this.id = id;
    this.path = path;
  }

  @Override
  public void run() {
    Workbook workbook = ExcelOperateUtil.getWorkbook(path);
    if (workbook != null) {
      TemplateManager.getInstance().addTemplate(id, workbook);
    }
  }

}
